package com.lyf.shop.web.controller;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

@WebServlet(name = "UserDemoServlet",value = "/user_demo")
public class UserDemoController extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //考虑到每个servlet只能做一个方法和对应一个路径非常的不方便，而且会导致大量的资源的浪费
        //使用一个参数来进行控制
        //每次路径请求的时候，都会带上一个参数，method然后通过这个参数的值来进行判断
        //我们去调用什么方法来进行业务的处理
        //1获取参数
        String method = request.getParameter("method");
        if(method == null){
            method="index";
        }
        // //2使用switch来进行业务的调用
        // switch (method){
        //     case "reg":
        //         //根据传递的参数调用不同的方法
        //         reg(request,response);
        //         break;
        //     case "login":
        //         login(request, response);
        //         break;
        //     default:
        // }
        /**
         * 第一个条件 我们传入的method的值和我们调用的方法名字是相同的
         * 第二个条件 我们调用的方法的参数是一样的
         *难题是方法名都不一样
         * 使用方法的名称加上参数就可以进行方法的调用
         * 反射
         */


        try {
            //1 获取类对象
            Class<? extends UserDemoController> userConClass = this.getClass();
            //通过类对象进行方法的调用
            Method method1 = userConClass.getMethod(method,HttpServletRequest.class,HttpServletResponse.class);
            //        UserController c = new UserController();
            //        c.login(request, response);
            //反射的方法调用
            //通过method对象调用方法的方式：invoke这个是方法的调用，他需要两个参数，第一个参数那个类进行方法的调用，
            // 第二个参数是一个可变长里面放的参数是：要调用的方法所需要的参数值
            method1.invoke(this,request,response);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }


    }
    //3编写对应的处理业务的方法
    public void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().println("这个地方是login（）方法的响应");
    }

    public void reg(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("注册");
        //拿用户的数据
        String uname = request.getParameter("uname");
        System.out.println("已经拿到参数了，这里是reg（）注册的方法"+uname);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}
